package com.tree.jpa.entity;

import lombok.Data;
import org.hibernate.annotations.GenericGenerator;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @ClassName com.tree.shiro.entity
 * Description: <类功能描述>. <br>
 * <p>
 * <使用说明>
 * </p>
 * @Author tree
 * @Date 2019-06-25 22:13
 * @Version 1.0
 */
@Entity//声明一个实体，用的是Java规范下的注解
@Table(name="user")//映射的表名称
@Data
public class UserEntity {
    /**
     * @GenericGenerator 该注解为Hibernate的注解，用来生成表的主键策略，属性strategy的值在类DefaultIdentifierGeneratorFactory中定义:
     * uuid2: UUIDGenerator.class;
     * guid: GUIDGenerator.class;
     * uuid: UUIDHexGenerator.class;
     * uuid.hex: UUIDHexGenerator.class;
     * assigned: Assigned.class;
     * identity: IdentityGenerator.class;
     * select: SelectGenerator.class;
     * sequence: SequenceStyleGenerator.class;
     * seqhilo: SequenceHiLoGenerator.class;
     * increment: IncrementGenerator.class;
     * foreign: ForeignGenerator.class;
     * sequence-identity: SequenceIdentityGenerator.class;
     * enhanced-sequence: SequenceStyleGenerator.class;
     * enhanced-table: TableGenerator.class;
     */
    @Id //主键
    @GenericGenerator(name = "generator", strategy = "native")
    /**
     * @GeneratedValue 设置主键策略，这里属性generator指向@GenericGenerator策略的name，属性strategy有四个枚举值：
     * GenerationType.TABLE 使用一个额外的表来存储主键；
     * GenerationType.SEQUENCE 使用序列的方式存储，且需要数据库底层支持；
     * GenerationType.IDENTITY 由数据库生成，一般为主键自增等；
     * GenerationType.AUTO 表示由程序生成，不声明则默认为该属性
     */
    @GeneratedValue(generator = "generator")
    private Long id;

    /**
     * @Column 修改默认的ORM规则，属性有：
     * name设置表中字段名称，表字段和实体类属性相同，则该属性可不写；
     * unique设置该字段在表中是否唯一，默认false；
     * nullable是否可为空，默认true；
     * insertable表示insert操作时该字段是否响应写入，默认为true；
     * updatable表示update操作时该字段是否响应修改，默认为true；
     * columnDefinition是自定义字段，可以用这个属性来设置字段的注释；
     * table表示当映射多个表时，指定表的表中的字段，默认值为主表的表名；
     * length是长度，仅对varchar类型的字段生效,默认长度为255；
     * precision表示一共多少位；
     * scale表示小数部分占precision总位数的多少位，例子中两者共同使用来确保经纬度的精度；
     */
    @Column(name = "username", nullable = false, unique = true)
    private String userName;

    @Column(nullable = false)
    private String password;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

}
